//后端入口文件
const express = require("express");
const app = express();
//跨域配置
const cors = require("cors");
app.use(
  cors({
    "Access-Control-Allow-Origin": "*",
    "Access-Control-Allow-Headers": "*",
    "Access-Control-Allow-Methods": "'get', 'post'",
  })
);

// app.all("*", function (req, res, next) {
//   //设置允许跨域的域名，*代表允许任意域名跨域
//   res.header("Access-Control-Allow-Origin", "*");
//   //允许的header类型
//   res.header("Access-Control-Allow-Headers", "*");
//   //跨域允许的请求方式
//   res.setHeader("Access-Control-Allow-Methods", ["get", "post"]);
//   if (req.method.toLowerCase() == "options") res.send(200);
//   //让options尝试请求快速结束
//   else next();
// });

//全局中间件
app.use(function (req, res, next) {
  //抛出异常的方法
  res.error = function (err, status) {
    res.send({
      // 状态
      status,
      // 状态描述，判断 err 是 错误对象 还是 字符串
      message: err instanceof Error ? err.message : err,
    });
  };
  next();
});
// 导入配置文件
const config = require("./config");
// 解析 token 的中间件
const expressJWT = require("express-jwt");
// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证 //
app.use(
  expressJWT({ secret: config.jwtSerectKey }).unless({ path: ["/user/login"] })
);
//配置解析表单数据的中间件来解析application/x-www-form-urlencoded
app.use(express.urlencoded({ extended: false }));

const joi = require("joi");

//导入路由模块
const useRouter = require("./router/user");
app.use("/user", useRouter);

// 错误中间件
app.use(function (err, req, res, next) {
  // 数据验证失败
  if (err instanceof joi.ValidationError) {
    return res.error(err, 404);
  }
  // 捕获身份认证失败的错误
  if (err.name === "UnauthorizedError") return res.error("身份认证失败!", 401);
  // 未知错误
  res.error(err, 500);
});

app.listen(3000, (err, result) => {
  console.log("http://127.0.0.1:3000");
});
